package File_input_output;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class ByteArrayStream {

	public static void main(String[] args) {

		try {
			
			
			// Para leitura de arquivos vamos utilizar a Classes FileInputStream
			// Para escrita de arquivos vamos utilizar a Classes FileOutputStream

			//Ambas as classes precisa ter um Objeto do tipo FILE ou STRING para aleitura e escrita respectivamente 
			File Target = new File("Target");//Objeto do tipo FILE que sera utilizado pelo FileInputStream
			File Source = new File("Source");//Objeto do tipo FILE que sera utilizado pelo FileOutputStream

			InputStream input = new FileInputStream(Source);

			//OBSERVACAO: O FileOutputStream possue uma SOBRECARGA do construtor com um argumento boleano indicando que, se o arquivo existir, 
			//o conteudo do stream deve ser adicionado (append) caso contrario o conteudo vai ser sobrescrito!
			OutputStream output = new FileOutputStream(Target);//neste caso nao ha arquivo existente!

			//Arrray de bytes para o FileOtputStream, neste caso a escrita esta 
			byte[] buffer = new byte[1024];

			int streamingLength = 1024;

			while (streamingLength == 1024) {
				
				//METODO READ()
				// O metodo read():
				//le um numero de bytes equivalente ao tamanho do array passado como argumento ou apenas um byte se for passado um byte
				//escreve estes bytes no array
				//retorna quantos bytes foram lidos - eh utilizado como argumento LENGTH do metodo write
				streamingLength = input.read(buffer);
				
				// METODO WRITE()
				//O metodo write() escreve o que esta no array em um arquivo
				//O metodo WRITE(byte[], int offset, int length) precisa dos seguintes argumentos:
				//byte[] b - buffer (array de dados a serem escritos)
				//int off - start offset (indice de inicio do buffer)
				//int length - quantos bytes de b devem ser escritos.

				//EXEMPLO: buffer - array temporario, 0 inicio no indice zero do array buffer, escrita ate o final do array 1024
				output.write(buffer, 0, streamingLength);

			}
			
			//IMPORTANTE: Fechar o canal de comunicacao!
			input.close();
			output.close();
			
			
			
			
			
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
